// 定义关于user的store
import { defineStore } from 'pinia'
import { loginApi } from '@/api/login'
import { getUserInfoApi } from '@/api/login'
// 状态数据
const state = () => ({
  token: '',
  userInfo: {}
})
// actions定义操作状态数据的一系列函数
const actions = {
  // 设置pinia中的token,同时会持久化到本地local storage
  setToken(token) {
    this.token = token
  },
  // 移除pinia中的Token,同时移除本地local storage的Token
  removeToken() {
    this.token = ''
  },
  // 设置pinia中的登录用户信息，同时会持久化到本地local storage
  setUserInfo(userInfo) {
    this.userInfo = userInfo
  },
  // 移除pinia中的登录用户信息,同时移除本地local storage的登录用户信息
  removeUserInfo() {
    this.userInfo = {}
  },
  // 登录 action
  loginAction({ phone, password }) {
    return new Promise((resolve, reject) => {
      // 调用登录接口
      loginApi({ phone, password })
        .then((res) => {
          this.setToken(res.accessToken)
          resolve()
          // 注意：因为使用了pinia状态持久化插件，因此当数据存储在pinia中的时候，也会在本地存储一份该数据
          // pinia中的数据是保存在内存中（临时存储），页面刷新数据就丢失后了；只有把数据存储在本地，这样的话，数据刷新才不丢失。
          // 今后操作数据的原则（原则依据：pinia持久化插件帮我们实现了）：
          // 1. 无论是获取数据还是修改数据，一律操作的都是 pinia 中的数据；因为当 pinia 中的数据发生变化了，本地存储中的数据会同步发生变化
          // 2. 当页面刷新的时候，插件会自动将本地存储中的数据给 pinia 中的数据赋值，从而保证了 pinia 中的数据刷新不丢失
        })
        .catch((error) => {
          reject(error)
        })
    })
  },
  // 获取用户信息 action
  getUserInfoAction() {
    return new Promise((resolve, reject) => {
      // 发请求
      getUserInfoApi()
        .then((userInfo) => {
          this.setUserInfo(userInfo)
          resolve()
        })
        .catch((error) => {
          reject(error)
        })
    })
  },
  // 退出 action
  logoutAction() {
    this.removeToken()
    this.removeUserInfo()
  }
}
// 按需导出状态数据仓库user
export const useUserStore = defineStore('user', {
  state,
  actions,
  persist: true // 持久化
})
